home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Joystick Magazine 1995 July & August
/
cd No4 joystick No62.iso
/
mac
/
pc
/
EMULATOR
/
PC370
/
DEMO
/
DEMOHATS.ALC
< prev
next >
Wrap
Text File
|
1986-07-21
|
7KB
|
197 lines
TITLE 'HATGIRL2.ALC - CALCULATE VALUE OF E FOR N HATS'
* PGMID. HATGIRL2.ALC
* AUTHOR. DON HIGGINS.
* 6365 - 32 AVENUE NORTH
* ST. PETERSBURG, FL 33710
*
* DATE. 09/07/85.
* REMARKS. THIS PROGRAM CALCULATES VALUE OF E (BASE OF NATUARAL
* LOGRITHMS) USING THE CARELESS HAT CHECK GIRL ALGORITHM
* DESCRIBED BY ROBERT T. KUROSAKA IN 9/85 BYTE. HE
* SHOWS THAT E IS EQUAL TO N! DIVIDED BY THE NUMBER OF
* WAYS THAT N HATS CAN BE DISTRIBUTED SUCH THAT NO ONE
* GETS THE CORRECT HAT.
*
* THIS ALGORITHM IS WRITTEN IN IBM 370 ASSEMBLER TO BE
* RUN ON AN IBM PC USING THE PC/370 ASSEMBLER AND
* EMULATOR. THIS PROGRAM DIFFERS FROM THE BASIC PROGRAM
* SHOWN IN BYTE, IN THAT IT IS DETERMINISTIC RATHER THAN
* USING A RANDOM SAMPLE OF DISTRIBUTIONS TO APPROXIMATE
* THE ANSWER FOR A GIVEN N. THIS PROGRAM CALCULATES THE
* EXACT ANSWER FOR A GIVEN N. THE LARGER THE VALUE OF N,
* THE MORE ACCURATE THE ANSWER IS.
*
HATGIRL2 CSECT
LR BASE,ENTRY
USING HATGIRL2,BASE
LA N,2
LA ONE,1
LA BADCOMB,0
L ENTRY,=V(TIMER)
BALR LINK,ENTRY SAVE STARTING TIME IN 100TH SECONDS
ST R0,TIME
MAINLOOP EQU *
BAL LINK,CALCBAD COUNT BAD COMBINATIONS FOR CURRENT N
BAL LINK,CALCE CALCULATE N! AND E FOR CURRENT N
L ENTRY,=V(TIMER)
BALR LINK,ENTRY
L R1,TIME
ST R0,TIME SAVE NEW TIME
SR R0,R1
CVD R0,PWORK
MVC DS,DSMASK
ED DS,PWORK+4 EDIT SECONDS
LA R2,MSGLINE
SVC WTO DISPLAY RESULTS FOR CURRENT N
AR N,ONE
CH N,=AL2(MAXN)
BNH MAINLOOP
SVC EXIT
TITLE 'CALCBAD - CALCULATE NUMBER OF BAD COMBINATIONS FOR N'
CALCBAD EQU * CALCULATE BADCOMB = TOTAL BAD COMBINATIONS
*
* INCREMENT COMBINATION COUNTER D(N) TO NEXT BAD COMBINATION
* INCREMENT BADCOMB
* EXIT WHEN COUNTER OVERFLOWS
*
XR BADCOMB,BADCOMB
MVC D,DINIT
MVC DP,DPINIT
LA I,1
XR R1,R1
XR R2,R2
LR NM1,N
BCTR NM1,0 SET NM1 = N - 1
INCDI EQU * INCREMENT D(I) TO NEXT BAD DIGIT
IC J,D-1(I)
FINDD EQU * SEARCH DP(J) TO DP(N) FOR NEXT DIGIT
AR J,ONE
CLR J,N
BH NOTFOUND NO BAD DIGITS FOUND, GO INCR PREV DIGIT
IC R1,DP-1(J)
CLR I,R1 IS NEXT HIGHEST DIGIT AVAILABLE
BNL FINDD NO, GO TO NEXT LARGER DIGIT
CLR J,I IS NEXT DIGIT BAD
BE FINDD NO, GO TO NEXT LARGER DIGIT
FOUND EQU * SWAP LARGER DIGIT WITH D(I)
IC R1,D-1(I) SAVE OLD DIGIT
IC R2,DP-1(J) SAVE OLD POSITION OF NEW DIGIT
STC J,D-1(I) STORE NEW DIGIT
STC I,DP-1(J) SET POSITION OF NEW DIGIT
STC R1,D-1(R2) STORE OLD DIGIT
STC R2,DP-1(R1) SET POSITION OF OLD DIGIT
SORT EQU *
*
* SORT D(I+1) TO D(N) IN ASCENDING ORDER
*
XR J,J
LR K,I
NEXTDK EQU * SEARCH DP(J) FOR NEXT DIGIT FOR D(K)
AR K,ONE
CLR K,N
BNL CHKLAST GO CHECK IF LAST SORTED DIGIT D(N) IS BAD
NEXTDPJ EQU * FIND NEXT HIGHEST DIGIT FOR D(K)
AR J,ONE
IC R1,DP-1(J)
CLR K,R1 IS THIS DIGIT AVAILABLE
BH NEXTDPJ
BE CHKDIGIT IF ALREADY AT K, SKIP SWAP
IC R1,D-1(K) SAVE OLD DIGIT
IC R2,DP-1(J) SAVE OLD POSITION OF NEW DIGIT
STC J,D-1(K) STORE NEW DIGIT
STC K,DP-1(J) SET POSITION OF NEW DIGIT
STC R1,D-1(R2) STORE OLD DIGIT
STC R2,DP-1(R1) SET POSITION OF OLD DIGIT
CHKDIGIT EQU *
CLR J,K IS SORT DIGIT BAD
BNE NEXTDK YES, CONTINUE SORT
LR I,K NO, GO INCR GOOD DIGIT
B INCDI
CHKLAST EQU *
IC R1,D-1(K)
CLR K,R1 IS LAST DIGIT BAD
BNE SORTOK YES, SORT DONE
LR I,NM1 NO, GO INCR D(N-1)
B INCDI
SORTOK EQU *
AR BADCOMB,ONE COUNT BAD COMBINATION
LR I,NM1 GO INCR D(N-1)
B INCDI
NOTFOUND EQU *
BCTR I,0 DECREMENT I
IC R1,D-1(I)
LTR R1,R1 IF NOT OVERFLOW
BNE INCDI THEN GO INCREMENT NEW D(I)
BR LINK ELSE EXIT WITH BAD COMBINATION COUNT
TITLE 'CALCE - CALCULATE N! AND E FOR GIVEN N'
CALCE EQU * CALCULATE AND FORMAT RESULTS
CVD N,PWORK
MVC DNN,DNMASK
ED DNN,PWORK+6 N
LR R1,N
LR R2,N
BCTR R2,0
NFAC EQU *
MR R0,R2 GENERATE N!
BCT R2,NFAC
CVD R1,PWORK
MVC DT,DTMASK
ED DT,PWORK+4 N!
ZAP PT,PWORK
CVD BADCOMB,PWORK
MVC DB,DBMASK
ED DB,PWORK+4 BAD COMBINATIONS
MP PT,=P'100000000'
DP PT,PWORK+4(4)
MVC DE,DEMASK
ED DE,PT+7 E
BR LINK
*
* REGISTER ASSIGNMENTS
*
R0 EQU 0 WORK
R1 EQU 1 WORK
R2 EQU 2 WORK
N EQU 3 NUMBER OF HATS
BADCOMB EQU 4 BAD COMBINATION COUNTER
I EQU 5 INDEX FOR DIGITS D(I) AND DP(I)
J EQU 6 INDEX FOR DIGITS D(J) AND DP(J)
K EQU 7 INDEX FOR DIGITS D(K) AND DP(K)
ONE EQU 10 FREQUENTLY USED CONSTANT
NM1 EQU 11 FREQUENTLY USED CONSTANT N-1
BASE EQU 12 BASE
LINK EQU 14 LINK
ENTRY EQU 15 ENTRY
*
* PC/370 SYSTEM SVC'S
*
WTO EQU 209 WRITE TO OPERATOR (R2 = ADDRESS OF TEXT FOLLOWED BY $)
EXIT EQU 0 RETURN TO MSDOS
*
* DATA AREAS
*
MAXN EQU 7 MAX NUMBER OF COMBINATIONS (7 TAKES 40 SECONDS ON PC)
DINIT DC (MAXN)AL1(*-DINIT+1) COMBINATION REGISTER WITH DIGITS
DPINIT DC (MAXN)AL1(*-DPINIT+1) POSITION OF VALUE IN D(I)
DC C'*** D REG ***'
DC X'00' FORCE OVERFLOW ON CARRY OUT
D DC XL(MAXN)'00' BAD COMBINATION REGISTER
DC C'*** DP REG ***'
DP DC XL(MAXN)'00' DIGIT POSITION INDEX REGISER
PWORK DC D'0' WORK AREA FOR CVD
PT DC PL16'0' WORK AREA TO CALC TOTCOMB/BADCOMP
TIME DC F'0'
MSGLINE EQU *
DC C' N='
DNN DC C' ZZZ',C' N!='
DT DC C' Z,ZZZ,ZZZ',C' BAD='
DB DC C' Z,ZZZ,ZZZ',C' E='
DE DC C' 9.99999999',C' SEC='
DS DC C' ZZ,ZZZ',C'$'
DNMASK DC X'40202020'
DTMASK DC X'4020',C',',X'202020',C',',X'202020'
DBMASK DC X'4020',C',',X'202020',C',',X'202020'
DEMASK DC X'4021',C'.',8X'21'
DSMASK DC X'402020',C',',X'202121'
END HATGIRL2